/*
 * @(#)LoginFenster.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.gui;

import de.hdm.gruppenkalender.team04.data.Person;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * Login-Formular, ermöglicht den Einstieg in die Anwendung.
 * Eine Anmeldung als Nutzer sowie auch als Admin ist möglich.
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class LoginFenster extends JFrame {

    InterfaceClient ic;
    InterfaceClientReport icr;
    private Vector<String> namePersonen = new Vector<String>();
    HashMap<String, Person> hashMapPersonen = new HashMap<String, Person>();
    private JComboBox cbxPerson;
    private JCheckBox chbAdmin = new JCheckBox("Administrator anmelden?");
    private JButton loginButton = new JButton("Anmelden");
    // Handelt es sich um einen Login für den Report, oder die Verwaltung?
    private boolean istVerwaltungsLogin;

    /**
     * Konstruktor.
     *
     * Setzt das Fenster oben links an den Bildschirm und
     * stößt das Erstellen der beinhalteten Elemente an.
     */
    public LoginFenster(boolean istVerwaltungsLogin) {
        this.istVerwaltungsLogin = istVerwaltungsLogin;
        if (this.istVerwaltungsLogin) {
            ic = InterfaceClient.interfaceClient();
        } else {
            icr = InterfaceClientReport.interfaceClientReport();
        }
        this.setLocation(30, 30);
        this.erstelleElemente();
    }

    /**
     * erstellt die im Fesnter enthaltenen Elemente.
     */
    public void erstelleElemente() {

        if (istVerwaltungsLogin) {
            this.setTitle("Anmeldung am Verwaltungs-System");
        } else {
            this.setTitle("Anmeldung am Report-System");
        }

        // Haupt-Panel zuordnen.
        this.add(erstelleHauptPanel());

        // Anwendung bei Schließen des Fensters beenden.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Frame packen und anzeigen.
        this.setResizable(false);
        this.pack();
        this.setVisible(true);
    }

    /**
     * Erstellt das Haupt-Panel des Login-Fensters.
     *
     * @return  JPanel  hauptPanel
     */
    public JPanel erstelleHauptPanel() {
        JPanel hauptPanel = new JPanel();

        // GridBagLayout mit Abstand zwischen den Elementen.
        hauptPanel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.LINE_START;
        c.insets = new Insets(5, 5, 5, 5);

        // Abstand nach außen erzeugen.
        hauptPanel.setBorder(new EmptyBorder(10, 10, 10, 10));

        c.gridx = 0;
        c.gridy = 0;
        hauptPanel.add(new JLabel("Person auswählen.:", JLabel.RIGHT), c);

        Vector<Person> personen = new Vector<Person>();
        if (istVerwaltungsLogin) {
            personen = ic.ermittleAllePersonen();
        } else {
            personen = icr.ermittleAllePersonen();
        }

        // HashMap verknüpft angzeigte String mit Personen-Objekten.
        hashMapPersonen = new HashMap<String, Person>();

        /**
         * Alle in Datenbank vorhandenen Personen durchlaufen und
         * ComboBox, sowie HashMap hinzufügen.
         */
        for (Person p : personen) {
            try {
                String name = p.getNachname() + ", " + p.getVorname();
                namePersonen.addElement(name);
                hashMapPersonen.put(name, p);
            } catch (RemoteException ex) {
                Logger.getLogger(LoginFenster.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }

        cbxPerson = new JComboBox(namePersonen);

        c.gridx = 1;
        c.gridy = 0;
        hauptPanel.add(cbxPerson, c);

        chbAdmin.setSelected(false);
        chbAdmin.addChangeListener(new ChangeListener() {

            public void stateChanged(ChangeEvent e) {
                if (((JCheckBox) e.getSource()).isSelected()) {
                    cbxPerson.setEnabled(false);
                } else {
                    cbxPerson.setEnabled(true);
                }
            }
        });

        if (personen.size() < 1) {
            chbAdmin.setSelected(true);
            chbAdmin.setEnabled(false);
        }

        c.gridx = 2;
        c.gridy = 0;
        hauptPanel.add(chbAdmin, c);

        loginButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (chbAdmin.isSelected()) {
                    // Weiterleitung ohne Personenangabe
                    if (istVerwaltungsLogin) {
                        // Verwaltung starten.
                        new HauptFenster();
                    } else {
                        // Report starten.
                        new ReportFenster();
                    }
                    setVisible(false);
                    dispose();
                } else {
                    // Ausgewählten String in Person "umwandeln". (Hash-Map)
                    Person person = hashMapPersonen.get((String) cbxPerson.
                            getSelectedItem());

                    try {
                        System.out.println(person.getNachname() + ", " + person.
                                getVorname() + " wird eingeloggt.");
                    } catch (RemoteException ex) {
                        Logger.getLogger(LoginFenster.class.getName()).log(
                                Level.SEVERE, null, ex);
                    }

                    if (istVerwaltungsLogin) {
                        // Verwaltung starten.
                        new HauptFenster(person);
                    } else {
                        // Report starten.
                        new ReportFenster(person);
                    }
                    setVisible(false);
                    dispose();
                }
            }
        });

        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 2;
        hauptPanel.add(loginButton, c);

        return hauptPanel;
    }
}
